iT邦幫忙

0

Day 11:OWASP Top 10 漏洞(一):SQL 注入攻擊(SQL Injection)原理與手動測試

  • 分享至 

  • xImage
  •  

💡 什麼是 SQL 注入攻擊(SQLi)?
在完成了前期的資訊收集與漏洞掃描後,今天我們正式邁入第三階段:OWASP Top 10 核心漏洞剖析!

SQL 注入攻擊(SQL Injection, SQLi) 算得上是 Web 資安史上最經典、破壞力也最強大的漏洞之一。當 Web 應用程式在處理使用者輸入的資料時,未進行適當的過濾或轉義,就直接將輸入字串「拼接」進 SQL 查詢指令中,攻擊者就能藉由注入惡意的 SQL 語法,改變原本 SQL 指令的執行邏輯。

成功利用 SQLi 漏洞,攻擊者可以:

繞過身份驗證(不需密碼直接登入)

讀取資料庫中的敏感資料(帳號、密碼hash、信用卡號)

修改或刪除資料庫資料

甚至在特定條件下取得伺服器的作業系統控制權(RCE)

🔍 SQL 注入的核心原理:字串拼接的災難
假設網站後台有一個登入驗證的 SQL 查詢如下:

SQL
SELECT * FROM users WHERE username = 'USER_INPUT' AND password = 'USER_INPUT';
若網頁對 username 沒有做任何過濾,攻擊者在帳號欄位輸入:

Plaintext
admin' OR '1'='1
最終拼湊出來的 SQL 語法就會變成:

SQL
SELECT * FROM users WHERE username = 'admin' OR '1'='1' AND password = '...';
因為 '1'='1' 永遠為真(True),使得整個 WHERE 判斷條件恆成立,伺服器就會誤以為驗證成功,直接發放 admin 的管理員權限!

🛠️ 手動測試 SQLi 的基本步驟
在自動化工具登場前,手動測試能幫助我們理解漏洞的本質:

  1. 尋找注入點(閉合測試)
    在網址參數(如 ?id=1)或表單輸入框中加入單引號 ' 或雙引號 ":

http://target.com/page.php?id=1'

觀察回應: 若頁面跳出 SQL syntax error、Unclosed quotation mark 或頁面直接崩潰(500 錯誤),代表該輸入點很有可能存在 SQL 注入漏洞!

  1. 判斷資料庫欄位數量(ORDER BY 測試)
    利用 ORDER BY 指令測試後端查詢回傳了幾個欄位:

http://target.com/page.php?id=1 ORDER BY 1-- -(正常)

http://target.com/page.php?id=1 ORDER BY 5-- -(若報錯,代表欄位數小於 5)

💡 註解符號小知識: SQL 中的 -- - 或 # 用於將後方的原始 SQL 指令註解掉,避免語法報錯。

  1. 聯合查詢提取資料(UNION SELECT)
    確認欄位數後,利用 UNION SELECT 拼接自己的查詢:

Plaintext
http://target.com/page.php?id=-1 UNION SELECT 1, version(), database()-- -
將原本 id 設為不存在的 -1,讓頁面優先顯示 UNION 後方我們想發動查詢的結果(例如資料庫版本與資料庫名稱)。


*提醒邦友,使用第三方服務/API 時,請務必評估資安風險與隱私保護
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言